Slide 94
Slide 94 text
dh( kdf_key, self_static_private, remote_ephemeral_public );
kdf( chain_key ).update( kdf_key ).get( chain_key, aead_key );
out.resize( wg_kx2_len, 0u );
if( !aead_dec( incoming_remote_static_public, aead_key, 0ull, encrypted_static, hash_key ) )
throw invalid_packet();
hash().update( hash_key, encrypted_static ).get( hash_key );
dh( kdf_key, self_static_private, remote_static_public );
kdf( chain_key ).update( kdf_key ).get( chain_key, aead_key );
if( !aead_dec( remote_timestamp, aead_key, 0ull, encrypted_timestamp, hash_key ) )
throw invalid_packet();
hash().update( hash_key, encrypted_timestamp ).get( hash_key );
out.resize( wg_kx2_len, 0u );
auto self_ephemeral_public = make_svv( out.data(), wg_kx2_ephemeral_offset, wg_ephemeral_len );
auto encrypted_empty = make_svv( out.data(), wg_kx2_encrypted_empty_offset, wg_encrypted_empty_len );
dh_generate( self_ephemeral_private, self_ephemeral_public );
kdf( chain_key ).update( self_ephemeral_public ).get( chain_key );
hash().update( hash_key, self_ephemeral_public ).get( hash_key );
dh( kdf_key, self_ephemeral_private, remote_ephemeral_public );
kdf( chain_key ).update( kdf_key ).get( chain_key );
dh( kdf_key, self_ephemeral_private, remote_static_public );
kdf( chain_key ).update( kdf_key ).get( chain_key );
kdf( chain_key ).update( q ).get( chain_key, t, aead_key );
hash().update( hash_key, t ).get( hash_key );
aead_enc( encrypted_empty, aead_key, 0ull, empty, hash_key );
hash().update( hash_key, encrypted_empty ).get( hash_key );
out[ 0 ] = 0x02;
namespace karma = boost::spirit::karma;
karma::generate( std::next( out.begin(), wg_kx2_self_spi_offset ), karma::little_dword, self_spi );
karma::generate( std::next( out.begin(), wg_kx2_remote_spi_offset ), karma::little_dword, remote_spi );
auto kx2_mac1_message = make_svv( out.data(), 0, wg_kx2_mac1_message_len );
InitiatorHelloΛड͚औΔ
ࣗͷ੩తൿີ伴(b)ͱ૬खͷ੩తެ։伴(ac)ͰabcΛ࡞Γ
abcΛKDFʹ௨ͯ͠࡞ͬͨ伴Ͱ
λΠϜελϯϓΛ෮߸ग़དྷΔࣄΛ֬ೝ͢Δ
https://github.com/Fadis/userspace_wireguard
ιʔείʔυ