Ldap a";选择“;

Ldap a";选择“;,ldap,asn.1,Ldap,Asn.1,我正在尝试使用ApacheHarmony ASN.1/BER类解析LDAP绑定请求(可以使用另一个库,我只是选择了它,因为它有Apache许可证) 我的问题是关于ASN.1中“选择”的编码。定义LDAP ASN.1模式()的RFC将以下内容作为绑定请求的一部分提供: BindRequest ::= [APPLICATION 0] SEQUENCE { version INTEGER (1 .. 127), na

我正在尝试使用ApacheHarmony ASN.1/BER类解析LDAP绑定请求(可以使用另一个库,我只是选择了它,因为它有Apache许可证)

我的问题是关于ASN.1中“选择”的编码。定义LDAP ASN.1模式()的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 }
这种选择实际上是如何编码的

我使用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处)似乎代表了该选择。足够公平-我得到(per)最后一位的设置是为了表明它是“特定于上下文的”(即由此应用程序/协议定义),但我如何知道这是“简单”还是“sasl”身份验证?什么指示正在使用哪个选项?在本例中,看起来下一个字节(0x0a)是字符串的长度-因此这可能是一个八进制字符串或类似的东西-但我在这里没有看到任何指示实际长度的内容,而不是0x80


我也不确定上面选择部分中的[0]和[3]是什么意思。这是说有四个选项,但只有编号为0和3的选项在使用吗?

下面您可以看到openssl asn1parse命令的输出。
选项
成员使用所谓的上下文特定标记进行编码-这意味着正常标记值将替换为ASN.1定义中为
选项
中的各个项目指定的标记值。标记的值为0,表示选择了选项中的第一项。第一个选项的类型为
八位字符串
。上下文特定标记的值0提供有关值类型的信息。如果没有上下文标记,则将使用普通的
八位字节字符串
标记

 0:d=0  hl=2 l=  49 cons: SEQUENCE          
 2:d=1  hl=2 l=   1 prim:  INTEGER           :01
 5:d=1  hl=2 l=  44 cons:  appl [ 0 ]        
 7:d=2  hl=2 l=   1 prim:   INTEGER           :03
10:d=2  hl=2 l=  27 prim:   OCTET STRING      :uid=testuser,dc=test,dc=com
39:d=2  hl=2 l=  10 prim:   cont [ 0 ]        

上述编码信息中的“80”H称为“标识符八位字节”(通常它可能不止一个八位字节)。标识符八位字节的该值表示所选择的备选方案为“简单”,因为“80”H的五个低位为“00000”B,与“简单”([0])标签的标签号相匹配

如果发送方选择了“sasl”备选方案,标识符八位字节将是“A3”H而不是“80”H。“A3”H中的“3”H(五个低阶位)是“sasl”标签的标签号([3])。对于两个备选方案,标识符八位字节的两个最高顺序位都设置为“10”B,因为[0]和[3]都是“上下文特定”标记(这只是意味着这些标记不包含应用程序关键字或私有关键字)。标识符八位字节的下一位(“构造”位)对于“简单”设置为“0”,但是对于“sasl”设置为“1”,因为“sasl”的编码包含嵌套标记,“简单”的编码不包含任何嵌套标记