Preliminarmente, espero que você não tenha feito o que mostrou. Exceto para os rótulos, todos os dados usados na derivação de chave TLS são dados binários que não podem ser fornecidos com precisão como argumento para um comando echo
do shell ou qualquer outro comando, exceto possivelmente a versão integrada em zsh
se você desativar os escapes e certamente não pode ser "digitado" (mesmo cortado e colado) em um argumento literal com aspas simples.
Se você realmente tiver os dados em arquivos, eles poderão ser usados. Os dados binários podem ser lidos e gravados em arquivos - pelo menos nas plataformas que o OpenSSL suporta. Se você não tem arquivos (mas tem pipes), pode contornar isso passando os dados em hexadecimais e com exceção de -macopt hexkey:
, que já usa hexadecimal, usando um programa como xxd -r
ou printf
com o hex formado em escapes, ou echo
com o hex formado em escapes não portáteis, ou hacks como GNU sed s///e
, ou um programa mais geral awk
ou perl
, para converter o hex a binário para entrada codificar%. E, quando necessário, hacks semelhantes para converter a saída binária em hexadecimal, mas openssl
pode produzir em hexadecimal, contanto que você remova o dgst -mac hmac
da frente.
Mais substantivamente, executar a primeira saída HMAC de volta por si só fornece os blocos 'A', que você executa em outra camada de HMACs para obter a saída real 'P_hash'. Veja o link que é efetivamente a mesma pergunta usando um vetor de teste publicado no link exceto que eu atendi em Java. Aqui está o equivalente da linha de comando do OpenSSL:
$ echo $key; echo $lbsd # start from hex
9bbe436ba940f017b17652849a71db35
74657374206c6162656c a0ba9f936cda311827a6f796ffd5198c
$ echo $lbsd | xxd -r -p >a0
$ openssl dgst -sha256 -mac hmac -macopt hexkey:$key <a0 -binary >a1
$ openssl dgst -sha256 -mac hmac -macopt hexkey:$key <a1 -binary >a2
$ openssl dgst -sha256 -mac hmac -macopt hexkey:$key <a2 -binary >a3
$ openssl dgst -sha256 -mac hmac -macopt hexkey:$key <a3 -binary >a4
$ cat a1 a0 | openssl dgst -sha256 -mac hmac -macopt hexkey:$key -binary >k1
$ cat a2 a0 | openssl dgst -sha256 -mac hmac -macopt hexkey:$key -binary >k2
$ cat a3 a0 | openssl dgst -sha256 -mac hmac -macopt hexkey:$key -binary >k3
$ cat a4 a0 | openssl dgst -sha256 -mac hmac -macopt hexkey:$key -binary >k4
$ cat k1 k2 k3 k4 | head -c100 | xxd
0000000: e3f2 29ba 727b e17b 8d12 2620 557c d453 ..).r{.{..& U|.S
0000010: c2aa b21d 07c3 d495 329b 52d4 e61e db5a ........2.R....Z
0000020: 6b30 1791 e90d 35c9 c9a4 6b4e 14ba f9af k0....5...kN....
0000030: 0fa0 22f7 077d ef17 abfd 3797 c056 4bab .."..}....7..VK.
0000040: 4fbc 9166 6e9d ef9b 97fc e34f 7967 89ba O..fn......Oyg..
0000050: a480 82d1 22ee 42c5 a72e 5a51 10ff f701 ....".B...ZQ....
0000060: 8734 7b66 .4{f
Se você conseguir que seu código replique isso, ele também deve funcionar para o handshake TLS1.2 real, ajustado para os tamanhos corretos: 48 para o segredo mestre e dependendo do ciphersuite para as teclas de trabalho.