Во-первых, ваш файл mseed (метка + начальное значение в PRF) должен быть 77 байтов, а не 69. Вы, должно быть, каким-то образом испортили одноразовые номера клиента и / или сервера.
Во-вторых, -hmac spre.key
это неправильно. В качестве ключа HMAC используются фактические символы, s p r e . k e y
т. Е. Октеты 73 70 72 65 2e 6b 65 79. Вам необходимо использовать значение расшифрованного секрета premaster, которое является содержимым вашего файла spre.key. А поскольку это двоичные данные, которые могут включать байты, которые представляют собой специальные коды символов, такие как нуль, табуляция, долларовый знак, кавычка, обратная косая черта, удаление и т. Д., Вы не можете безопасно передавать их напрямую, -hmac
или даже -hmac ''
; вместо этого вам нужно использовать, -mac hmac -macopt hexkey:
как я показал в предыдущем ответе, за исключением использования фактического значения шестнадцатеричного ключа, которое вы показали в этом вопросе, а именно 0303CB30...2CDC
.
В-третьих, как я показал в предыдущем ответе, вы объединяете результаты второго уровня HMAC, то есть в моих обозначениях k1, k2, ..., чтобы сформировать вывод (который в этом примере был 100 октетов):
$ cat k1 k2 k3 k4 | head -c100 | xxd
но как я сказал дальше:
... и для фактического рукопожатия TLS1.2, настроенного на правильную длину: 48 для главного секрета и в зависимости от набора шифров для рабочих ключей.
Для первого (premaster-to-master) деривации вам нужно 48 октетов, поэтому вам нужны только первые два блока по 32 (a0-> a1-> a2 a1 + a0-> k1 a2 + a0-> k2), затем конкатенируйте k1 + k2 и возьмите первые 48 октетов.
Для второго (мастер-работающего) деривации необходимая длина зависит от согласованного набора шифров. Вы сказали, что используете RSA-with-AES256CBC-SHA, которому (в TLS1.2 или 1.1, но не 1.0) требуется 40 октетов ключей HMAC и 64 октета ключей шифрования, общим объемом 104 октета. Для 104 ocets вам нужно вычислить 4 порции по 32, объединить k1 + k2 + k3 + k4 и разложить их на client-MAC, server-MAC, client-encryption, server-encryption в этом порядке. Смотрите 6.3 RFC. Также обратите внимание, что метка отличается, и для этого деривации начальное число (метка +) server_random + client_random, а не (метка +) client_random + server_random, как в первом.