Как автоматически создать OID (SHA-256) в MbedTLS/OpenSSL?

Я использую MbedTLS в прошивке. Я успешно получил удаленный файл и его зашифрованный хэш, зашифрованный закрытым ключом (через OpenSSL). Я использовал mbedtls_sha256(), чтобы локально создать собственный хэш файла, а затем mbedtls_pk_verify() сравнить его с полученным зашифрованным хешем.

Однако функция mbedtls_pk_verify() терпит неудачу. Глядя на память с помощью отладчика, я вижу, что два хэша сами по себе совпадают, пока они приостановлены внутри mbedtls_pk_verify(), но я заметил, что есть много байтов, которые предшествуют одному хешу, которые отсутствуют в другом (расшифрованном) хэше. И я вижу, что mbedtls_pk_verify() пытается сравнить эти лишние байты...

Я обнаружил, что это, скорее всего, байты «OID», используемые для объявления алгоритма SHA-256. Есть ли способ автоматически добавить эти необходимые байты? В противном случае, каков обычный способ сделать то, что я хочу?

Это подпись RSASSA-PKCS1v1_5, также известная как RSA «классическая» или «устаревшая»? Здесь действительно используется заполнение, которое включает, но не только, OID используемого алгоритма хеширования; см. RFC8017 9.2 особенно примечание 1 на стр. 47. Я не знаю mbed, но был бы удивлен, если бы какая-либо криптобиблиотека за последние 40 лет не поддерживала эту схему подписи. Хотя я бы не ожидал этого при вызове хэша, потому что хеши используются во многих контекстах, отличных от подписей RSA-PKCS1v1_5. ...

dave_thompson_085 15.07.2024 23:09

... в OpenSSL (и, предположительно, Libre и Boring) в исходном устаревшем RSA_{sign,verify} API он предоставляется напрямую, а более новый предпочтительный EVP_PKEY_{sign,verify}* API дополняется EVP_PKEY_CTX_{set,get}_signature_md или параметром 'digest' в EVP_PKEY_CTX_ctrl[_str]

dave_thompson_085 15.07.2024 23:13

@dave_thompson_085 Да, MbedTLS на стороне встроенной прошивки, похоже, выполняет метод подписи RSASSA-PKCS1v1_5, таким образом добавляя байты OID во время функции проверки к ожидаемому закодированному хешу (что-то вроде: 0x00 0x01 0xFF ... 0xFF 0x00 0x30 0x31 .. . [правильный, расшифрованный хеш], который соответствует описанию вашего URL). Итак, нужно ли мне каким-то образом добавлять эти байты OID к исходному дайджесту/хешированию прошивки OpenSSL перед ее отправкой на встроенное устройство - это типично?

kackle123 16.07.2024 14:47

«зашифровано с помощью закрытого ключа» — это нонсенс (но это абсурд, который сделали люди, так что вы вполне можете столкнуться с плохим протоколом). Вы можете использовать закрытый ключ для расшифровки или подписи, а открытый ключ — для шифрования или проверки. mbedtls_pk_verify хочет подпись PKCS#1v1.5, но то, что вы ему передаете, очевидно, не подпись. Каково содержимое данных, которые вы получаете после декодирования RSA (т. е. полный шестнадцатеричный дамп, заканчивающийся хешем)? Есть ли у вас код, который вызывает openssl для получения этих данных?

Gilles 'SO- stop being evil' 17.07.2024 20:30

@Жиль, я узнаю больше по мере продвижения; Теперь я понимаю, что здесь задействована формализованная терминология. Я полагаю, что «подпись» в данном случае означает хэш, к которому добавлены байты заполнения и OID? Однако я бы сказал, что «зашифровать с помощью закрытого ключа» — это не нонсенс… Я могу «зашифровать хеш с помощью закрытого ключа» так же, как я мог бы зашифровать размер обуви моей бабушки, не так ли? Конечно, это не будут «подписи», поэтому mbedtls_pk_verify() меня подвел.

kackle123 18.07.2024 15:50

@Gilles Разница между шифрованием хеша и созданием правильной подписи заключается в том, где я заблудился (см. мой ответ).

kackle123 18.07.2024 16:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я обнаружил, что mbedtls_pk_verify() не удалось выполнить MbedTLS, потому что я использовал неправильную команду в OpenSSL для создания исходного зашифрованного хеша/подписи. Я использовал openssl dgst... когда мне нужно было использовать openssl sha256 -sign... Это добавляло необходимые байты (подписи), которые MbedTLS mbedtls_pk_verify() искал. Спасибо всем ответившим за то, что помогли мне разобраться.

К вашему сведению: openssl $hash -sign rsapriv или эквивалент openssl dgst -$hash -sign rsapriv — лучший способ, но openssl $hash -binary | openssl pkeyutl -sign -pkeyopt digest:$hash -inkey rsapriv также правильно выполняет PKCS1v1_5, а openssl $hash -binary | openssl rsautl -sign -inkey rsapriv — нет. Если бы вы включили это в свой вопрос, я бы сразу сказал вам.

dave_thompson_085 19.07.2024 07:39

@dave_thompson_085 Спасибо за ваши ответы. Я не знал, что мне нужно было включить это в свой первоначальный вопрос, поскольку я был новичком в этой сфере. Я винил свою прошивку, когда создал проблему еще на своем компьютере!

kackle123 20.07.2024 00:21

Другие вопросы по теме