#stun #turn #ice

stun-rs

Rust框架用于管理STUN消息

9个版本

0.1.8 2024年3月18日
0.1.7 2024年3月11日
0.1.5 2023年10月8日
0.1.4 2022年11月15日
0.1.1 2022年10月30日

#1 in #turn

Download history 1711/week @ 2024-04-22 1742/week @ 2024-04-29 1117/week @ 2024-05-06 1975/week @ 2024-05-13 1938/week @ 2024-05-20 1124/week @ 2024-05-27 2221/week @ 2024-06-03 852/week @ 2024-06-10 1678/week @ 2024-06-17 1585/week @ 2024-06-24 1849/week @ 2024-07-01 2247/week @ 2024-07-08 1602/week @ 2024-07-15 2230/week @ 2024-07-22 2642/week @ 2024-07-29 2853/week @ 2024-08-05

9,353 每月下载量
用于 17 个crate(直接使用2个)

MIT/Apache

420KB
8K SLoC

Crates.io Docs codecov Rust Report Card

Crate stun-rs

此crate提供了一种简单但高效的框架来管理STUN协议消息。实现基于

  • RFC5769. NAT穿越实用工具(STUN)的测试向量。
  • RFC5780. 使用NAT穿越实用工具(STUN)进行NAT行为发现。
  • RFC8016. 使用NAT周围的中继进行NAT穿越(TURN)的移动性。
  • RFC8445. 交互式连接建立(ICE)。
  • RFC8489. NAT穿越实用工具(STUN)。
  • RFC8656. 使用NAT周围的中继进行NAT穿越(TURN)。

使用方法

创建并编码STUN绑定请求的示例

 // Create attributes
 let username = UserName::new("\u{30DE}\u{30C8}\u{30EA}\u{30C3}\u{30AF}\u{30B9}")?;
 let nonce = Nonce::new("f//499k954d6OL34oL9FSTvy64sA")?;
 let realm = Realm::new("example.org")?;
 let password = "TheMatrIX";
 let algorithm = Algorithm::from(AlgorithmId::MD5);
 let key = HMACKey::new_long_term(&username, &realm, password, algorithm)?;
 let integrity = MessageIntegrity::new(key);

 // Create the message
 let msg = StunMessageBuilder::new(
   BINDING,
   MessageClass::Request,
 )
 .with_attribute(username)
 .with_attribute(nonce)
 .with_attribute(realm)
 .with_attribute(integrity)
 .build();

 // Create an encoder to encode the message into a buffer
 let encoder = MessageEncoderBuilder::default().build();
 let mut buffer: [u8; 150] = [0x00; 150];
 let size = encoder.encode(&mut buffer, &msg)?;
 assert_eq!(size, 116);

解码STUN绑定响应并获取一些属性的示例

 // This response uses the following parameter:
 // Password: `VOkJxbRl1RmTxUk/WvJxBt` (without quotes)
 // Software name: "test vector" (without quotes)
 // Mapped address: 192.0.2.1 port 32853
 let sample_ipv4_response = [
     0x01, 0x01, 0x00, 0x3c, // Response type and message length
     0x21, 0x12, 0xa4, 0x42, // Magic cookie
     0xb7, 0xe7, 0xa7, 0x01, // }
     0xbc, 0x34, 0xd6, 0x86, // }  Transaction ID
     0xfa, 0x87, 0xdf, 0xae, // }
     0x80, 0x22, 0x00, 0x0b, // SOFTWARE attribute header
     0x74, 0x65, 0x73, 0x74, // }
     0x20, 0x76, 0x65, 0x63, // }  UTF-8 server name
     0x74, 0x6f, 0x72, 0x20, // }
     0x00, 0x20, 0x00, 0x08, // XOR-MAPPED-ADDRESS attribute header
     0x00, 0x01, 0xa1, 0x47, // Address family (IPv4) and xor'd mapped port number
     0xe1, 0x12, 0xa6, 0x43, // Xor'd mapped IPv4 address
     0x00, 0x08, 0x00, 0x14, // MESSAGE-INTEGRITY header
     0x2b, 0x91, 0xf5, 0x99, // }
     0xfd, 0x9e, 0x90, 0xc3, // }
     0x8c, 0x74, 0x89, 0xf9, // } HMAC-SHA1 fingerprint
     0x2a, 0xf9, 0xba, 0x53, // }
     0xf0, 0x6b, 0xe7, 0xd7, // }
     0x80, 0x28, 0x00, 0x04, // FINGERPRINT attribute header
     0xc0, 0x7d, 0x4c, 0x96, // Reserved for CRC32 fingerprint
 ];

 // Create a STUN decoder context using the password as a short credential
 // mechanism and force validation of MESSAGE-INTEGRITY and FINGERPRINT
 let ctx = DecoderContextBuilder::default()
   .with_key(
     HMACKey::new_short_term("VOkJxbRl1RmTxUk/WvJxBt")?,
   )
   .with_validation()
   .build();
 let decoder = MessageDecoderBuilder::default().with_context(ctx).build();

 let (msg, size) = decoder.decode(&sample_ipv4_response)?;
 assert_eq!(size, sample_ipv4_response.len());

 // Check message method is a BINDING response
 assert_eq!(msg.method(), BINDING);
 assert_eq!(msg.class(), MessageClass::SuccessResponse);

 let software = msg.get::<Software>()
   .ok_or("Software attribute not found")?
   .as_software()?;
 assert_eq!(software, "test vector");

 let xor_addr = msg.get::<XorMappedAddress>()
   .ok_or("XorMappedAddress attribute not found")?
   .as_xor_mapped_address()?;
 let socket = xor_addr.socket_address();
 assert_eq!(socket.ip(), IpAddr::V4(Ipv4Addr::new(192, 0, 2, 1)));
 assert_eq!(socket.port(), 32853);
 assert!(socket.is_ipv4());

常见功能

此crate定义了以下可以启用的功能标志

  • discovery: 扩展了对RFC5780中定义的属性的解析支持。使用NAT穿越实用工具(STUN)进行NAT行为发现。
  • mobility: 扩展了对RFC8016中定义的属性的解析支持。使用NAT周围的中继进行NAT穿越(TURN)的移动性。
  • turn: 扩展了对RFC8656中定义的属性的解析支持。使用NAT周围的中继进行NAT穿越(TURN)。
  • ice: 扩展了对RFC8445中定义的属性的解析支持。交互式连接建立(ICE)。
  • experiments: 此标志可以设置以调整库的一些行为,例如默认填充。在测试协议时,我们可以使用此标志强制库保持与未知属性相关联的数据。默认情况下,未知属性不存储数据以节省内存消耗。

贡献

欢迎提交补丁和反馈。

捐赠

如果您觉得这个项目有帮助,您可以考虑进行捐赠

Bitcoin QR Code Ethereum QR Code

许可证

本项目采用以下任何一个许可证:

say thanks

依赖项

~6MB
~133K SLoC