Клиентский ключ доступа и серверный ключ записи из OpenSSL C API - PullRequest
1 голос
/ 07 мая 2010

У меня есть необходимость доступа к ключам шифрования (шифрования, записи), которые генерируются из главного ключа, который генерируется из OpenSSL C API. Я знаю, что могу получить доступ к главному ключу, используя структуру SSL следующим образом:

ssl->session->master_key

К сожалению, просмотр кода OpenSSL меня не сильно продвинул, так как API не очень хорошо документирован, а просмотр GDB также был болезненным. Они где-нибудь выставлены?

Спасибо

1 Ответ

1 голос
/ 04 декабря 2010

Я тоже работаю над тем же. Для соединений SSlv3 вы можете получить доступ к блоку клавиш,

ssl->s3->tmp.key_block

Однако мне удалось получить это в конце метода ssl3_setup_key_block, который определен в файле s3_enc.c. Я имею в виду, что я изменил исходный код и перекомпилировал openssl. Так что я пока не знаю, изменится ли он или потеряется после возвращения из этой функции.

Этот ключевой блок является строкой и, как определено в http://www.ietf.org/rfc/rfc2246.txt, имеет структуру;

{

clientWriteMACSecret,

  serverWriteMACSecret,

  clientWriteKey,

  serverWriteKey,

  clientWriteIV,

  serverWriteIV

}

Длина каждого раздела зависит от используемого набора шифров.

Для соединений SSLv2, я полагаю, вы можете снова получить доступ к этим областям, позвонив также по номеру ssl->s2->something. s2 - это объект структуры ssl2_state_st, который определен в ssl2.h. Вы можете посмотреть это оттуда.

Я не знаю, как это для соединений TLSv1. Но в структуре SSL есть и переменная d1.

Как личное замечание, исходный код openssl - это действительно куча мусора. Нет хороших комментариев к коду, нет хорошей документации. Бродить по исходному коду, чтобы найти простейшую вещь, это боль.

...