Рейтинг:1

Как определить размер поля кривой в подписи ECDSA

флаг in

В некоторых прошивках, над которыми я работаю, есть ошибка, которая гласит следующее:

Если отдельные координаты короче или длиннее размера поля кривой, они обрабатываются некорректно.

Так что я могу получить координаты из подписи, R и S, но я понятия не имею, как определить размер поля кривой.

Я специально смотрю на этот сертификат для AWS IoT

-----НАЧАТЬ СЕРТИФИКАТ-----
MIIDhzCCAy2gAwIBAgIQF+SpiRTfcZT9xPl3Soz4nTAKBggqhkjOPQQDAjCBgDEL
MAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYD
VQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMTEwLwYDVQQDEyhTeW1hbnRlYyBD
bGFzcyAzIEVDQyAyNTYgYml0IFNTTCBDQSAtIEcyMB4XDTIwMDgxNzAwMDAwMFoX
DTIxMDgxODIzNTk1OVowdzELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0
b24xEDAOBgNVBAcMB1NlYXR0bGUxGTAXBgNVBAoMEEFtYXpvbi5jb20SIELuYy4x
JjAkBgNVBAMMHSouaW90LnVzLWVhc3QtMS5hbWF6b25hd3MuY29tMFkwEwYHKoZI
zj0CAQYIKoZIzj0DAQcDQgAEIovCJVKZaWFewxZ53PJMVfekj8AZRY37L7WsXjO/
Q3X46R/62ps82FR+cRmNh/I5SvcrmAvMGlM+1hl1LiE6q6OCAY8wggGLMEUGA1Ud
EQQ+MDyCG2lvdC51cy1lYXN0LTEuYW1hem9uYXdzLmNvbYIdKi5pb3QudXMtZWFz
dC0xLmFtYXpvbmF3cy5jb20wCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCB4AwHQYD
VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMGEGA1UdIARaMFgwVgYGZ4EMAQIC
MEwwIwYIKwYBBQUHageEWF2h0dHBzOi8vZC5zeW1jYi5jb20vY3BzMCUGCCsGAQUF
BwICMBkMF2h0dHBzOi8vZC5zeW1jYi5jb20vcnBhMB8GA1UdIwQYMBaAFCXwiuFL
etkBlQrtxlPxjHgf2fP4MCsGA1UdHwQkMCIwIKAeoByGGmh0dHA6Ly9yYy5zeW1j
Yi5jb20vcmMuY3JsMFcGCCsGAQUFBweEBBEswSTAfBggrBgeEFBQcwAYYTaHR0cDov
L3JjLnN5bWNkLmNvbTAmBggrBgEFBQcwAoYaaHR0cDovL3JjLnN5bWNiLmNvbS9y
Yy5jcnQwCgYIKoZIzj0EAwIDSAAwRQIgAKO6zCfmxUpg1BVa1s2Y2WiWPSpNlpDa
syCuV6Lm6YkCIQD0I2WI1gP9zqk4lxlOfBb/2S4zOw/1OU9QV8BadDCe7w==
-----КОНЕЦ СЕРТИФИКАТА-----

Спасибо!

Рейтинг:1
флаг in

Ваш сертификат содержит открытый ключ, 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».

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

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