仅当长度可被 4 整除时才接受 Coturn 字符串值
Coturn string values only accepted when length is divisible by 4
我是 运行 Azure 虚拟机 运行 Ubuntu 16.04.2 LTS 上的 coturn 服务器。我正在用 c# 实现一个 TURN 客户端,我正在努力解决我假设是服务器配置中的问题、服务器软件中的错误或客户端中的编码问题。
我第一次注意到这个问题是在我从服务器收到 REALM
时。域名是 9 个字符,但我不断从服务器获得 3 个额外的 NULL
个字符。在尝试更改我发送的软件版本时,我的怀疑得到了证实。如果长度不能被 4 整除,服务器将不会发回任何内容(我现在相信它是根据适当的 STUN/TURN 规范默默地丢弃消息,该规范规定丢弃未知属性)。
根据规范,我将字符串编码为 UTF-8
(存储字符串类型 TLV 属性的示例)
private void StoreString(AttributeType key, string v, byte[] msg, ref int offset)
{
byte[] stringBytes = Encoding.UTF8.GetBytes(v);
// Attribute header
StoreAttributeType(key, msg, ref offset);
msg[offset++] = (byte)(stringBytes.Length >> 8);
msg[offset++] = (byte)(stringBytes.Length & 0xFF);
Array.Copy(stringBytes, 0, msg, offset, stringBytes.Length);
offset += stringBytes.Length;
}
原始字节:
01-13-00-40-21-12-A4-42-57-9E-20-40-86-81-34-F9-B0-64-C1-E4-00-09-00-10-00-00-04-01-55-6E-61-75-74-68-6F-72-69-7A-65-64-00-15-00-10-39-64-38-35-62-66-61-66-62-63-34-36-30-62-31-66-00-14-00-09-74-65-73-74-72-65-61-6C-6D-00-00-00-80-22-00-04-4E-6F-6E-65
我使用规范解析并得到
Type: AllocateErrorResponse, Length: 64, ID: 42a41221-9e57-4020-8681-34f9b064c1e4
Attributes:
- Type: ErrorCode, Value: Code: Unauthorized, Reason: Unauthorized
- Type: Nonce, Value: 9d85bfafbc460b1f
- Type: Realm, Value: testrealm
Attribute parsing not implemented for 0
- Length: 128, Value: 22-00-04-4E-6F-6E-65
它试图用type=0
和length=128
解析的值实际上是消息的结尾和服务器软件名称
80-22-00-04-4E-6F-6E-65
属性8022
定义为属性SOFTWARE
,长度为0x0004
,值4E-6F-6E-65
为文本None
所以服务器正在返回所有正确的值和所有正确的长度,但似乎字符串被填充为 UTF-16 可整除的长度。所以这似乎是一个编码问题,但我不知道它是服务器中的软件错误、服务器上的配置问题还是我的客户端中的问题。我知道这都是开源的,我可以深入研究源代码,但我希望在我必须走那么远之前有人有一些见识。
好吧...当您对 RFC 不够重视时就会发生这种情况...
RFC 5389
15. STUN Attributes
After the STUN header are zero or more attributes. Each attribute
MUST be TLV encoded, with a 16-bit type, 16-bit length, and value.
Each STUN attribute MUST end on a 32-bit boundary. As mentioned
above, all fields in an attribute are transmitted most significant
bit first.
所以看起来关键是 每个 STUN 属性必须以 32 位边界结束。因此,在读取我的9个字符域时,应该读取剩余的字节并丢弃。
我是 运行 Azure 虚拟机 运行 Ubuntu 16.04.2 LTS 上的 coturn 服务器。我正在用 c# 实现一个 TURN 客户端,我正在努力解决我假设是服务器配置中的问题、服务器软件中的错误或客户端中的编码问题。
我第一次注意到这个问题是在我从服务器收到 REALM
时。域名是 9 个字符,但我不断从服务器获得 3 个额外的 NULL
个字符。在尝试更改我发送的软件版本时,我的怀疑得到了证实。如果长度不能被 4 整除,服务器将不会发回任何内容(我现在相信它是根据适当的 STUN/TURN 规范默默地丢弃消息,该规范规定丢弃未知属性)。
根据规范,我将字符串编码为 UTF-8
(存储字符串类型 TLV 属性的示例)
private void StoreString(AttributeType key, string v, byte[] msg, ref int offset)
{
byte[] stringBytes = Encoding.UTF8.GetBytes(v);
// Attribute header
StoreAttributeType(key, msg, ref offset);
msg[offset++] = (byte)(stringBytes.Length >> 8);
msg[offset++] = (byte)(stringBytes.Length & 0xFF);
Array.Copy(stringBytes, 0, msg, offset, stringBytes.Length);
offset += stringBytes.Length;
}
原始字节:
01-13-00-40-21-12-A4-42-57-9E-20-40-86-81-34-F9-B0-64-C1-E4-00-09-00-10-00-00-04-01-55-6E-61-75-74-68-6F-72-69-7A-65-64-00-15-00-10-39-64-38-35-62-66-61-66-62-63-34-36-30-62-31-66-00-14-00-09-74-65-73-74-72-65-61-6C-6D-00-00-00-80-22-00-04-4E-6F-6E-65
我使用规范解析并得到
Type: AllocateErrorResponse, Length: 64, ID: 42a41221-9e57-4020-8681-34f9b064c1e4
Attributes:
- Type: ErrorCode, Value: Code: Unauthorized, Reason: Unauthorized
- Type: Nonce, Value: 9d85bfafbc460b1f
- Type: Realm, Value: testrealm
Attribute parsing not implemented for 0
- Length: 128, Value: 22-00-04-4E-6F-6E-65
它试图用type=0
和length=128
解析的值实际上是消息的结尾和服务器软件名称
80-22-00-04-4E-6F-6E-65
属性8022
定义为属性SOFTWARE
,长度为0x0004
,值4E-6F-6E-65
为文本None
所以服务器正在返回所有正确的值和所有正确的长度,但似乎字符串被填充为 UTF-16 可整除的长度。所以这似乎是一个编码问题,但我不知道它是服务器中的软件错误、服务器上的配置问题还是我的客户端中的问题。我知道这都是开源的,我可以深入研究源代码,但我希望在我必须走那么远之前有人有一些见识。
好吧...当您对 RFC 不够重视时就会发生这种情况...
RFC 5389
15. STUN Attributes
After the STUN header are zero or more attributes. Each attribute
MUST be TLV encoded, with a 16-bit type, 16-bit length, and value.
Each STUN attribute MUST end on a 32-bit boundary. As mentioned
above, all fields in an attribute are transmitted most significant
bit first.
所以看起来关键是 每个 STUN 属性必须以 32 位边界结束。因此,在读取我的9个字符域时,应该读取剩余的字节并丢弃。