@@ -826,3 +826,130 @@ fn connection_fails_encoder_returned_too_long() {
826826
827827 connect_fail ( & mut client, & mut server) ;
828828}
829+
830+ fn connected_pair ( ) -> ( Client , Server ) {
831+ fixture_init ( ) ;
832+ let mut client = Client :: new ( "server.example" , true ) . expect ( "should create client" ) ;
833+ let mut server = Server :: new ( & [ "key" ] ) . expect ( "should create server" ) ;
834+ connect ( & mut client, & mut server) ;
835+ ( client, server)
836+ }
837+
838+ #[ test]
839+ fn export_keying_material_basic ( ) {
840+ let ( client, _server) = connected_pair ( ) ;
841+
842+ let mut material = vec ! [ 0u8 ; 32 ] ;
843+ client
844+ . export_keying_material ( b"EXPORTER-test" , & [ ] , & mut material)
845+ . expect ( "should export keying material" ) ;
846+ assert_ne ! ( material, vec![ 0u8 ; 32 ] ) ;
847+ }
848+
849+ #[ test]
850+ fn export_keying_material_differs_across_connections ( ) {
851+ let label = b"EXPORTER-test" ;
852+ let context = b"context-data" ;
853+
854+ let ( client1, _server1) = connected_pair ( ) ;
855+ let mut material1 = vec ! [ 0u8 ; 32 ] ;
856+ client1
857+ . export_keying_material ( label, context, & mut material1)
858+ . expect ( "first connection export" ) ;
859+
860+ let ( client2, _server2) = connected_pair ( ) ;
861+ let mut material2 = vec ! [ 0u8 ; 32 ] ;
862+ client2
863+ . export_keying_material ( label, context, & mut material2)
864+ . expect ( "second connection export" ) ;
865+
866+ assert_ne ! (
867+ material1, material2,
868+ "Different connections should produce different keying material"
869+ ) ;
870+ }
871+
872+ #[ test]
873+ fn export_keying_material_different_labels ( ) {
874+ let ( client, _server) = connected_pair ( ) ;
875+
876+ let mut material1 = vec ! [ 0u8 ; 32 ] ;
877+ client
878+ . export_keying_material ( b"EXPORTER-test1" , & [ ] , & mut material1)
879+ . expect ( "export with label1" ) ;
880+ let mut material2 = vec ! [ 0u8 ; 32 ] ;
881+ client
882+ . export_keying_material ( b"EXPORTER-test2" , & [ ] , & mut material2)
883+ . expect ( "export with label2" ) ;
884+
885+ assert_ne ! (
886+ material1, material2,
887+ "Different labels should produce different output"
888+ ) ;
889+ }
890+
891+ #[ test]
892+ fn export_keying_material_different_contexts ( ) {
893+ let ( client, _server) = connected_pair ( ) ;
894+
895+ let mut material1 = vec ! [ 0u8 ; 32 ] ;
896+ client
897+ . export_keying_material ( b"EXPORTER-test" , b"context1" , & mut material1)
898+ . expect ( "export with context1" ) ;
899+ let mut material2 = vec ! [ 0u8 ; 32 ] ;
900+ client
901+ . export_keying_material ( b"EXPORTER-test" , b"context2" , & mut material2)
902+ . expect ( "export with context2" ) ;
903+
904+ assert_ne ! (
905+ material1, material2,
906+ "Different contexts should produce different output"
907+ ) ;
908+ }
909+
910+ #[ test]
911+ fn export_keying_material_before_handshake ( ) {
912+ fixture_init ( ) ;
913+ let client = Client :: new ( "server.example" , true ) . expect ( "should create client" ) ;
914+
915+ assert_eq ! (
916+ client
917+ . export_keying_material( b"EXPORTER-test" , & [ ] , & mut [ 0u8 ; 32 ] )
918+ . unwrap_err( ) ,
919+ Error :: InvalidState
920+ ) ;
921+ }
922+
923+ #[ test]
924+ fn export_keying_material_zero_length ( ) {
925+ let ( client, _server) = connected_pair ( ) ;
926+
927+ assert_eq ! (
928+ client
929+ . export_keying_material( b"EXPORTER-test" , & [ ] , & mut [ ] )
930+ . unwrap_err( ) ,
931+ Error :: InvalidInput
932+ ) ;
933+ }
934+
935+ #[ test]
936+ fn export_keying_material_same_for_both_sides ( ) {
937+ let ( client, server) = connected_pair ( ) ;
938+
939+ let label = b"EXPORTER-test" ;
940+ let context = b"shared-context" ;
941+
942+ let mut client_material = vec ! [ 0u8 ; 32 ] ;
943+ client
944+ . export_keying_material ( label, context, & mut client_material)
945+ . expect ( "client export" ) ;
946+ let mut server_material = vec ! [ 0u8 ; 32 ] ;
947+ server
948+ . export_keying_material ( label, context, & mut server_material)
949+ . expect ( "server export" ) ;
950+
951+ assert_eq ! (
952+ client_material, server_material,
953+ "Both sides should export identical material"
954+ ) ;
955+ }
0 commit comments