我正在尝试使用 Apache Harmony ASN.1/BER 类解析 LDAP 绑定请求(可以使用另一个库,我只是选择了它,因为它具有 Apache 许可证)。
我的问题是关于 ASN.1 中“CHOICE”的具体编码。定义 LDAP ASN.1 模式 ( http://www.rfc-editor.org/rfc/rfc2251.txt ) 的 RFC 将以下内容作为绑定请求的一部分提供:
BindRequest ::= [APPLICATION 0] SEQUENCE {
version INTEGER (1 .. 127),
name LDAPDN,
authentication AuthenticationChoice }
AuthenticationChoice ::= CHOICE {
simple [0] OCTET STRING,
-- 1 and 2 reserved
sasl [3] SaslCredentials }
SaslCredentials ::= SEQUENCE {
mechanism LDAPString,
credentials OCTET STRING OPTIONAL }
那里的 CHOICE 实际上是如何编码的?
我使用 JXplorer 生成了一个示例绑定请求,并捕获了发送的原始数据。它看起来像这样:
00000000 30 31 02 01 01 60 2c 02 01 03 04 1b 75 69 64 3d |01...`,.....uid=|
00000010 74 65 73 74 75 73 65 72 2c 64 63 3d 74 65 73 74 |testuser,dc=test|
00000020 2c 64 63 3d 63 6f 6d 80 0a 74 65 73 74 69 6e 67 |,dc=com..testing|
00000030 31 32 33 |123|
那里的 80(偏移量 0x27)似乎代表了这种选择。很公平 - 我明白了(根据http://en.wikipedia.org/wiki/Basic_Encoding_Rules#BER_encoding)设置最后一位是为了表明它是“特定于上下文的”(即由这个应用程序/协议定义)但是我怎么知道这是“简单”还是“sasl”身份验证?什么表明正在使用哪个选项?在这种情况下,看起来下一个字节(0x0a)是字符串的长度 - 所以这可能是一个 OctetString 或类似的东西 - 但我在这里看不到任何表明实际值不是 0x80 的东西。 .
我也不确定上面 CHOICE 部分中的 [0] 和 [3] 是什么意思。那是说有四个选项,但只有编号为 0 和 3 的选项在使用?