gpt4 book ai didi

ldap - "Choice"的 BER 编码

转载 作者:行者123 更新时间:2023-12-03 02:15:28 27 4
gpt4 key购买 nike

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

我的问题是关于 ASN.1 中“CHOICE”的具体编码。定义 LDAP ASN.1 架构 ( http://www.rfc-editor.org/rfc/rfc2251.txt ) 的 RFC 提供以下内容作为绑定(bind)请求的一部分:

   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 生成了一个示例绑定(bind)请求并捕获了发送的原始数据。它看起来像这样:

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 )设置最后一位是为了表明它是“特定于上下文的”(即由该应用程序/协议(protocol)定义)但是我怎么知道这是一个“简单”还是“sasl”授权?什么表明正在使用选择的哪个选项?在这种情况下,看起来下一个字节(0x0a)是字符串的长度 - 所以这可能是一个 OctetString 或类似的东西 - 但我在这里没有看到任何表明除了 0x80 之外的实际值。 .

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

最佳答案

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

 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 ]

关于ldap - "Choice"的 BER 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18155577/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com