首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“选择”的BER编码

“选择”的BER编码
EN

Stack Overflow用户
提问于 2013-08-09 21:00:13
回答 2查看 3.5K关注 0票数 4

我试图使用ApacheHardyASN.1/BER类解析LDAP绑定请求(可以使用另一个库,因为它拥有Apache许可证)。

我的问题是关于ASN.1中“选择”的编码。定义LDAPASN.1模式(http://www.rfc-editor.org/rfc/rfc2251.txt)的RFC提供以下绑定请求:

代码语言:javascript
复制
   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生成了一个示例绑定请求,并捕获了发送的原始数据。看起来是这样的:

代码语言:javascript
复制
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)似乎代表了这一选择。很公平--我知道(每个encoding)最后一个位是为了表明它是“特定于上下文的”(即由这个应用程序/协议定义的),但是我怎么知道这是一个“简单的”还是"sasl“呢?什么显示正在使用的选择选项?在本例中,下一个字节(0x0a)是字符串的长度--因此这可能是一个OctetString或类似的类型--但我在这里没有看到任何指示实际值是0x80以外的.

我也不确定和3在上面的选择部分是什么意思。这是否意味着有四种选择,但只有编号为0和3的选项在使用?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-09 21:26:33

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

代码语言:javascript
复制
 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 ]        
票数 5
EN

Stack Overflow用户

发布于 2013-08-10 23:41:58

上面编码的消息中的'80'H被称为“标识符八进制”(通常它可能是多个八进制),标识符八进制的这个值表示所选择的选项是“简单的”,因为'80'H的五个低阶位是'00000'B,它与"simple“()的标签号相匹配。

如果发送者选择了"sasl“选项,标识符八进制将是'A3'H而不是'80'H。'A3'H中的'3'H (五个低阶位)是"sasl”(3)标记的标记号。对于这两个选项,标识符八进制的两个最高阶位被设置为'10'B,因为两者都是“特定于上下文的”标记(这意味着这些标记不包含应用程序关键字或私有关键字)。标识符八进制的下一位(“构造”位)被设置为'0‘表示“简单”,但对于"sasl“则设置为'1’,因为"sasl”的编码包含嵌套标记,而"simple“的编码不包含任何嵌套标记。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18155577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档